Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improves the UX of menu management in the navigation block #42987

Merged
merged 17 commits into from
Sep 5, 2022

Conversation

draganescu
Copy link
Contributor

@draganescu draganescu commented Aug 4, 2022

What?

Closes #42257, #42602, #38169

Why?

Simplifying the UX of the navigation block. The crowding of the block toolbar with all kinds of disconnected actions does not appear as a good path.

How?

A few tweaks:

  • move the items in the "select menu" block control to the block's inspector as follows:
    • the list of menus as a dropdown in an inspector panel
    • the manage menus action as a link button below the selector

Optional:

  • add a list view representing the tree of InnerBlocks of the navigation block to the block's inspector
    • allow adding new menu items from the list view representation
    • disable inner block selection from the list view
    • cull some of the useless list view item options (e.g. make template part)

To do

  • There has to be a chevron link in the dropdown toggle
  • The label of the currently selected menu does not update on change
  • The label of the currently selected menu does not update if menu is renamed from advanced
  • Use a visually hidden label to explain this is a menu switcher
  • Default to a button if there are no block menus and no classic menus
  • Rename "Loading options ..." to "Loading ..."
  • Rename "Select another menu" to "Select menu"
  • Removed disabled and implement isBusy
  • Update the navigation tests according to the new UI of the block

Testing Instructions

  1. Check out this PR
  2. Add a navigation block
  3. Behold the amazing UX
  4. Test that:
  • the menu can be switched to another menu
  • importing classic menus work
  • new menus can be created
  • renaming menus in advanced is immediately reflected in the control
  • keyboard navigation works as expected
  • screen readers announce this control properly

Screenshots or screencast

menu-switcher-gprs.mp4

@github-actions
Copy link

github-actions bot commented Aug 4, 2022

Size Change: +487 B (0%)

Total Size: 1.25 MB

Filename Size Change
build/block-editor/index.min.js 161 kB +6 B (0%)
build/block-library/blocks/navigation/editor-rtl.css 2.02 kB +37 B (+2%)
build/block-library/blocks/navigation/editor.css 2.03 kB +37 B (+2%)
build/block-library/editor-rtl.css 11 kB +33 B (0%)
build/block-library/editor.css 11 kB +33 B (0%)
build/block-library/index.min.js 188 kB +256 B (0%)
build/components/index.min.js 197 kB +12 B (0%)
build/compose/index.min.js 12 kB +13 B (0%)
build/data/index.min.js 8.06 kB -3 B (0%)
build/edit-post/index.min.js 30.6 kB +12 B (0%)
build/edit-site/index.min.js 57.9 kB +41 B (0%)
build/format-library/index.min.js 6.75 kB -2 B (0%)
build/redux-routine/index.min.js 2.74 kB +1 B (0%)
build/viewport/index.min.js 1.09 kB +11 B (+1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 982 B
build/annotations/index.min.js 2.76 kB
build/api-fetch/index.min.js 2.26 kB
build/autop/index.min.js 2.14 kB
build/blob/index.min.js 475 B
build/block-directory/index.min.js 7.05 kB
build/block-directory/style-rtl.css 990 B
build/block-directory/style.css 991 B
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/style-rtl.css 15.2 kB
build/block-editor/style.css 15.2 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 110 B
build/block-library/blocks/audio/theme.css 110 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 441 B
build/block-library/blocks/button/editor.css 441 B
build/block-library/blocks/button/style-rtl.css 505 B
build/block-library/blocks/button/style.css 505 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 187 B
build/block-library/blocks/comment-template/style.css 185 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 834 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 630 B
build/block-library/blocks/cover/editor-rtl.css 605 B
build/block-library/blocks/cover/editor.css 607 B
build/block-library/blocks/cover/style-rtl.css 1.55 kB
build/block-library/blocks/cover/style.css 1.55 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 110 B
build/block-library/blocks/embed/theme.css 110 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 253 B
build/block-library/blocks/file/style.css 254 B
build/block-library/blocks/file/view.min.js 346 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 948 B
build/block-library/blocks/gallery/editor.css 950 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 337 B
build/block-library/blocks/group/editor.css 337 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 327 B
build/block-library/blocks/html/editor.css 329 B
build/block-library/blocks/image/editor-rtl.css 876 B
build/block-library/blocks/image/editor.css 873 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 B
build/block-library/blocks/image/theme-rtl.css 110 B
build/block-library/blocks/image/theme.css 110 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 705 B
build/block-library/blocks/navigation-link/editor.css 703 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation-submenu/view.min.js 423 B
build/block-library/blocks/navigation/style-rtl.css 2.04 kB
build/block-library/blocks/navigation/style.css 2.03 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 443 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 493 B
build/block-library/blocks/post-comments-form/style.css 493 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 507 B
build/block-library/blocks/post-featured-image/editor.css 505 B
build/block-library/blocks/post-featured-image/style-rtl.css 166 B
build/block-library/blocks/post-featured-image/style.css 166 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 282 B
build/block-library/blocks/post-template/style.css 282 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 326 B
build/block-library/blocks/pullquote/style.css 325 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 282 B
build/block-library/blocks/query-pagination/style.css 278 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 439 B
build/block-library/blocks/query/editor.css 439 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 396 B
build/block-library/blocks/search/style.css 393 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 464 B
build/block-library/blocks/shortcode/editor.css 464 B
build/block-library/blocks/site-logo/editor-rtl.css 481 B
build/block-library/blocks/site-logo/editor.css 481 B
build/block-library/blocks/site-logo/style-rtl.css 192 B
build/block-library/blocks/site-logo/style.css 192 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.39 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 322 B
build/block-library/blocks/spacer/editor.css 322 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 494 B
build/block-library/blocks/table/editor.css 494 B
build/block-library/blocks/table/style-rtl.css 611 B
build/block-library/blocks/table/style.css 609 B
build/block-library/blocks/table/theme-rtl.css 175 B
build/block-library/blocks/table/theme.css 175 B
build/block-library/blocks/tag-cloud/style-rtl.css 239 B
build/block-library/blocks/tag-cloud/style.css 239 B
build/block-library/blocks/template-part/editor-rtl.css 235 B
build/block-library/blocks/template-part/editor.css 235 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 561 B
build/block-library/blocks/video/editor.css 563 B
build/block-library/blocks/video/style-rtl.css 174 B
build/block-library/blocks/video/style.css 174 B
build/block-library/blocks/video/theme-rtl.css 110 B
build/block-library/blocks/video/theme.css 110 B
build/block-library/common-rtl.css 1.01 kB
build/block-library/common.css 1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 11.9 kB
build/block-library/style.css 11.9 kB
build/block-library/theme-rtl.css 695 B
build/block-library/theme.css 700 B
build/block-serialization-default-parser/index.min.js 1.1 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 49.6 kB
build/components/style-rtl.css 11.5 kB
build/components/style.css 11.5 kB
build/core-data/index.min.js 15.5 kB
build/customize-widgets/index.min.js 11.3 kB
build/customize-widgets/style-rtl.css 1.38 kB
build/customize-widgets/style.css 1.38 kB
build/data-controls/index.min.js 653 B
build/date/index.min.js 32 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.69 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 3.99 kB
build/edit-navigation/style.css 3.99 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/style-rtl.css 6.93 kB
build/edit-post/style.css 6.93 kB
build/edit-site/style-rtl.css 8.2 kB
build/edit-site/style.css 8.18 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.33 kB
build/edit-widgets/style.css 4.34 kB
build/editor/index.min.js 41.6 kB
build/editor/style-rtl.css 3.66 kB
build/editor/style.css 3.65 kB
build/element/index.min.js 4.68 kB
build/escape-html/index.min.js 537 B
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.64 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.77 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.78 kB
build/keycodes/index.min.js 1.81 kB
build/list-reusable-blocks/index.min.js 1.74 kB
build/list-reusable-blocks/style-rtl.css 835 B
build/list-reusable-blocks/style.css 835 B
build/media-utils/index.min.js 2.93 kB
build/notices/index.min.js 953 B
build/nux/index.min.js 2.05 kB
build/nux/style-rtl.css 732 B
build/nux/style.css 728 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.22 kB
build/preferences/index.min.js 1.3 kB
build/primitives/index.min.js 933 B
build/priority-queue/index.min.js 612 B
build/react-i18n/index.min.js 696 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/reusable-blocks/index.min.js 2.21 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.4 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.53 kB
build/token-list/index.min.js 644 B
build/url/index.min.js 3.61 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.2 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.19 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@draganescu
Copy link
Contributor Author

Status:

  • shows the menu tree in a list view
  • I have some issues with making the tool panel menu work with menu actions:
    • for example to make it show the more icon instead of a plus icon
    • also to include action buttons instead of toggles for tool panel item

I may be using the wrong component.

@draganescu draganescu changed the title adds a list view with the navigation block inner blocks to the block's inspector Improves the UX of menu management in the navigation block Aug 6, 2022
@talldan
Copy link
Contributor

talldan commented Aug 8, 2022

Reminds me of #18202 😄

edit: just for reference, that was removed in #23022 (issue #20846, also see #19691). Something not captured in that issue, but I remember was an issue is that when there are a lot of menu items, the sidebar content can be quite lengthy. Other block tools get pushed out of view and a lot of scrolling is required.

@draganescu
Copy link
Contributor Author

Maybe for ease of review I'll create a separate PR adding the list view back. It also seems that the inspector of this block is getting extremely cluttered.

@draganescu draganescu force-pushed the try/navigation-list-view-block-controls branch from be27bc7 to 0009541 Compare August 25, 2022 14:02
@MaggieCabrera
Copy link
Contributor

This is a much better UX, I agree. It makes more sense to me to handle this in the sidebar. It's working as intended for me

Copy link
Contributor

@MaggieCabrera MaggieCabrera left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@draganescu
Copy link
Contributor Author

I found a showManageActions in the Navigation block edit component that was undefined but passed to the menu selector, defaulting to true. I removed it.

Copy link
Contributor

@getdave getdave left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for your work here. I believe the goal of reducing the UX "noise" currently associated with the block is a good one.

I noticed a few issues that I think we should look to resolve prior merging this.

The menu selector is lacking a border. Screen Shot 2022-08-26 at 10 09 18
Whilst loading the Menus section is empty and then changes to "Create new menu" even though menus are ultimately going to load.

Screen Capture on 2022-08-26 at 10-10-37

The `Manage menus` link seems to disappear and reappear each time you select a Menu.
Screen.Capture.on.2022-08-26.at.10-11-46.mp4
The UX when converting a classic menu doesn't provide good feedback. The Menus panel still shows the old menu and then suddenly updates. This leaves me able to change menus or even create new ones whilst the conversion process is happening. We need to improve the guards and gates using the data exposed by the conversion process utility hook.
Screen.Capture.on.2022-08-26.at.10-13-15.mp4
Similar problem with `Create Menu` action. It might be good to merge [#43529](https://github.com//pull/43529) (open with no reviews 😢 ) and _then_ look to take the learnings forward into this PR.
Screen.Capture.on.2022-08-26.at.10-14-59.mp4

Overall this is heading in a good direction. I think we need to do a bit more work to tidy up the UX to ensure we're providing solid feedback to the user.

One thing I would recommend trying that helped me was to test this using a slow internet connect as that quickly uncovers issues that can be masked by using a fast connection. I hope that helps?

@draganescu
Copy link
Contributor Author

draganescu commented Aug 26, 2022

Great review @getdave ! 😬 all these behaviors were exposed by the moving of the control as the panel in the inspector does not disappear but the toolbar section does and the effect is more jarring. Looking into it.

To do:

  • Investigate the lack of border in certain browsers
  • I can't repro this one in FF or Chromium
  • Optimistically update the label of the selector when converting classic menus
  • Bring over the update in Close the dropdown when creating a new menu in the Nav block #43529
  • Stop hiding the Manage menus link since the perms don't change between menu data fetching
  • Handle the whole inspector panel when menu data is loading, or use an accurate label on the selector and disable it

@draganescu draganescu force-pushed the try/navigation-list-view-block-controls branch from 0816e4a to 63ddb37 Compare August 26, 2022 09:41
@priethor
Copy link
Contributor

This PR will likely resolve/invalidate #38169 as well

@draganescu draganescu force-pushed the try/navigation-list-view-block-controls branch 2 times, most recently from b0bc044 to 50d69e2 Compare August 30, 2022 10:26
@draganescu
Copy link
Contributor Author

I have updated the PR description with a video with the current behavior. I'd love some design feedback at this point as the UI exemplified in #42602 (comment) is covered is covered but raises a few points to address:

  • @getdave and @javierarce is the slow connection behavior of disappearing and appearing items on screen something we address globally? I tried to keep things on screen and disable them during data roundtrips (e.g. the site logo block shows the placeholder then hides it if it finds there is a site logo - on a small enough connection we'd have time to interact with it).
  • @javierarce is the behavior I attempted via managing label copy something we find desirable? @talldan raised that "If there needs to be a CTA to create a menu when falling back to a page list, then perhaps it should just be a button rather than a dropdown with one option?" Should we switch to a button?
  • @alexstine or @talldan would a hidden descriptor referenced by an aria-describedby attribute of the dropdown's button toggle be enough in place of a label? This descriptor would be "Switch menu" as we lost this label because of the current behavior change of the menu selector (issue raised by @talldan)

This PR should not attempt to solve the general behavior of the Navigation block and how entities are loaded for it, as this causes most of the flickering / appearing / disappearing. For example, I think some of the things (like users perms) should be saved until page reload (between renders) - but then this PR is already a soup of refactoring and new functionality, I'd love to not make it worse.

draganescu and others added 2 commits September 2, 2022 14:07
…so we refresh this quite often when switching between menus. For a more consistent UI experience we disabe the menu management link untill `hasManagePermissions` is refreshed.

Another option would be to cache this at a component level. But, this could be more accurate?
Fixes slow connection UX by disabling and enabling the selector and the manage menus link depending on data status.

Co-authored-by: Dave Smith <[email protected]>
@draganescu draganescu force-pushed the try/navigation-list-view-block-controls branch from 50d69e2 to d641309 Compare September 2, 2022 11:07
@paaljoachim
Copy link
Contributor

paaljoachim commented Sep 2, 2022

Thank you for working on this @draganescu Andrei!

Testing.
Using the Gutenberg PR build.
Twenty Twenty Two.
In a new page I added the Nav block.

Before/After

Before:

Screenshot 2022-09-02 at 16 25 51

After:

Screenshot 2022-09-02 at 16 26 46

Should the Menu section be seen above the Layout section? As in importance it would be best to first see Menu section and then the Layout section.

Should the menu drop down have a border/outline giving a stronger signal that it is a drop down?

Clicking Manage menus leads one out of the page and into a Navigation Menus screen somewhere in the backend, and not connected with any place. Similar to managing Reusable blocks. Clicking to edit a menu in the Navigation Menus screen one can only edit the name and not the contents of the menu.
When clicking Manage menu I expected that it would make it easier for me in someway to edit the specific menu contents or that it might take me to the "old" Appearance -> Menus screen.

What else should I check?

My conclusion is that it is nice to add this specific feature into the sidebar. I look forward to having more of the Navigation features in the sidebar. Thanks.

@draganescu
Copy link
Contributor Author

Thanks for testing @paaljoachim 👍🏻

Should the Menu section be seen above the Layout section? As in importance it would be best to first see Menu section and then the Layout section.

Yes, but for some reason the layout options cannot be overiden yet.

Should the menu drop down have a border/outline giving a stronger signal that it is a drop down?

What browser were you testing with? I and others cannot repro the lack of border but you're the second to observe it.

What else should I check?

Updated the PR description with items.

- The label of the currently selected menu updates if menu is renamed from advanced
- Uses a visually hidden label to explain this is a menu switcher
- Defaults to a button if there are no block menus and no classic menus
- Renames "Loading options ..." to "Loading ..."

Co-authored-by: Javier Arce <[email protected]>
Co-authored-by: Alex Stine <[email protected]>
@paaljoachim
Copy link
Contributor

paaljoachim commented Sep 2, 2022

Local site using Desktop Server.
Php version 7.3.
Twenty Twenty Two theme.
Gutenberg PR build.

I have now tested with Brave, Firefox and Chrome. None had a grey border around it and looked like this (screenshot from Chrome): ![Screenshot 2022-09-02 at 17 45 57](https://user-images.githubusercontent.com/5323259/188191002-853cf04b-cda8-43d7-9862-ae3cea5fabfc.jpg)
Did an Inspect and noticed the .components-button had border 0. I adjusted it to 1px solid grey. It now has a grey border around the drop down as does every other button...:) So it is not the place to add it but I did it to experiment.

Screenshot 2022-09-02 at 17 42 55

Btw it took a moment (saw the spinner instead of the Nav block menu for half a second) before the menu showed up.

@talldan
Copy link
Contributor

talldan commented Sep 3, 2022

@talldan in an earlier comment you mentioned that if the ref'd menu is missing we should go forward with the fallback behavior instead of showing a placeholder. I strongly suggest we keep the placeholder because seeing different content as a result of a user deleting content is very confusing. However @javierarce we can revisit the placeholder and its options in a new PR!

I think it looks a bit like an error state, so I do think it's worth revisiting. Previously the placeholder was shown, but I guess there is no placeholder now. I see it wasn't introduced by this PR, so don't worry about it right now.

@javierarce
Copy link
Contributor

@javierarce I mean that the label of the select changes depending on situation:

if there are no block manus it says "No menus. Create one?"
if there is data still fetching "Loading options …"
if the currently ref'd menu is missing "Select another menu"
in that case switching to a button would be OK.

For the sake of consistency and simplicity, we should only have one message "Select menu" (and obviously "Loading..." for the loading state). Having different messages is confusing and could cause problems in other languages.

So we would have this:

  • If we are fetching data: "Loading..."
  • If there's a menu selected: the name of the menu
  • If there's no menu selected/reference is missing: "Select menu"
  • If there are no menus whatsoever: we show a button to create one

@javierarce the proposed UI looks great! One thing, if there are classic menus to import we should not default to a button, right?

Right, we should show "Select menu" because there are menus (the only difference is that the user will be able to import and select them simultaneously).

@javierarce ideally it shouldn't appear but there is some kind of bug outside the scope of this PR that makes the permission checks repeatedly and this causes the link to appear and disappear if connections are slow. I am disabling/enabling it so that we avoid jittery jumping screen elements. It's not ideal but I think it's better until we solve the original issue of requesting and updating permissions with every menu change/update.

Gotcha, thanks for the explanation!

Copy link
Contributor

@getdave getdave left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tested this and it's really good. I especially appreciate the work to ensure that the select menus close immediately upon selecting an option that causes an async action to occur.

Missing border appears to be coming from `.components-button`. Screen Shot 2022-09-05 at 10 11 17
I noticed that when switching between menus that are similar it's not always obvious that something has happened. We might need a follow up to announce (via a notification) that the menu has changed - especially for users of assistive technology.
Screen.Capture.on.2022-09-05.at.10-14-30.mp4

Copy link
Contributor

@scruffian scruffian left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a good improvement. I say we merge it and follow up with the necessary changes to the tests in a separate PR.

@getdave
Copy link
Contributor

getdave commented Sep 5, 2022

@draganescu I was testing with TT2. Now I'm on `emptytheme` the border is there 🤔 Screen Shot 2022-09-05 at 10 38 59

- replaces disabled with isBusy for toggle working state
- refactores some conditionals for better readability
- adds consistency to the toggle label

Co-authored-by: Daniel Richards <[email protected]>
Co-authored-by: Dave Smith <[email protected]>
Co-authored-by: Javier Arce <[email protected]>
Co-authored-by: Paal Joachim Romdahl <[email protected]>
@javierarce
Copy link
Contributor

This is looking great, but there's a small detail we could fix: if the user opens the dropdown and clicks on the already selected menu, the dropdown doesn't get closed. The proper behavior should be to close the dropdown.

@draganescu
Copy link
Contributor Author

@getdave it seems that after @scruffian 's commit moving the control styles from styles.scss to editor.scss the border appears in TT2 as well.


@javierarce we specifically implemented in the chances from @talldan that I brought over from #42956 to not close the menu when switching for a11y reasons.

@alexstine if we close the dropdown when selecting the same menu, should we focus the block or the control?

Either way this can be revisited.


@talldan Some details on isBusy and multiple clicks:

The DropdownMenu component does not expose the onToggle prop of Dropdown and onToggle is called before the click handler of the toggle.

I'll leave it as is, as multiple clicks don't damage data, it can only cause buggy UI and will come back with some kind of update for DropdownMenu.

This is the second issue I run into with a component in this PR - the 1st one being with Popover because its onFocusOutside prop when set skips the call to onToggle. I would have needed that to make the arrow of the control reset when the drop down closes on click outside of the control. Instead this is a known bug for now.

@draganescu
Copy link
Contributor Author

draganescu commented Sep 5, 2022

I will merge this and revisit the following:

  • adding (back) the list view of the navigation block to its inspector
  • fixing Popover somehow or the navigation selector via some "hack" to properly toggle the chevron when the popover closes via onFocusOutside
  • fixing DropdownMenu to be able to prevent it from toggling when the toggle isBusy
  • (maybe) closing the menu selector when the same menu as the one selected is clicked.

@draganescu draganescu merged commit d8bd044 into trunk Sep 5, 2022
@draganescu draganescu deleted the try/navigation-list-view-block-controls branch September 5, 2022 12:02
@github-actions github-actions bot added this to the Gutenberg 14.1 milestone Sep 5, 2022
@talldan
Copy link
Contributor

talldan commented Sep 6, 2022

@talldan Some details on isBusy and multiple clicks:

The DropdownMenu component does not expose the onToggle prop of Dropdown and onToggle is called before the click handler of the toggle.

@draganescu I'm not sure I follow. I think it was a normal Button that I left the comment on rather than a DropdownMenu. The one that appears when there are no menus. You should be able to return early from onClick to prevent anything bad happening from multiple clicks.

I guess it may also happen with dropdown menus and that's what you're referring to.

Anyway, I looked a bit deeper and I think I wasn't completely correct with my previous advice. You can use disabled, but __experimentalIsFocusable needs to be specified to make the Button component output aria-disabled instead of the normal disabled attribute and remain focused. isBusy can be used to show a loading indicator, but it depends on whether that fits the design. Here's some pseudocode:

<Button isBusy={ isCreatingMenu } disabled={ isCreatingMenu } __experimentalIsFocusable>Create menu</Button>

edit: Button does also implicitly prevent clicks when configured this way:

if ( disabled && isFocusable ) {
// In this case, the button will be disabled, but still focusable and
// perceivable by screen reader users.
tagProps[ 'aria-disabled' ] = true;
for ( const disabledEvent of disabledEventsOnDisabledButton ) {
additionalProps[ disabledEvent ] = ( event ) => {
event.stopPropagation();
event.preventDefault();
};
}
}

@jasmussen
Copy link
Contributor

jasmussen commented Sep 13, 2022

@draganescu It doesn't look like inspector menu editing made it in this round. It still seems valuable, is there any chance we can still land it?

Edit: from the context it looks like it was an oversight. I've reopened! 👍 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Navigation Affects the Navigation Block Needs Design Feedback Needs general design feedback. Needs User Documentation Needs new user documentation [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Navigation List View: Introduce navigation editable tree view in the inspector controls